#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

/*
 * 测试fork创建子进程
 * 理解fork函数的返回值
 * 通过if语句进行分流
 * 总结：fork创建子进程成功时，给父进程返回子进程PID，给子进程返回0，
 如果失败返回-1；通过两次fork可以发现当父进程执行后，才会去执行子进程，
 父子进程间存在独立性，即父进程被kill后，子进程任然可以运行,父子进程间存在写时拷贝机制，
 当子进程的值发生改变时，只会作用于子进程中
 */

int main()
{
  pid_t ret = fork(); //获取返回值
  int val = 1;  //比较值
  if(ret == 0)
  {
    //在子进程内再创建(孙)子进程
    pid_t rett = fork();
    if(rett > 0)
    {
      while(1)
      {
        val = 2;  //写时拷贝
        printf("二代进程正在执行 PID:%d PPID:%d 比较值为:%d 地址:%p\n\n", getpid(), getppid(), val, &val);
        sleep(1);
      }
    }
    else if(rett == 0)
    {
      while(1)
      {
        val = 3;  //写时拷贝
        printf("三代进程正在执行 PID:%d PPID:%d 比较值为:%d 地址:%p\n\n", getpid(), getppid(), val, &val);
        sleep(1);
      }
    }
    else
      printf("进程创建失败\n");
  }
  else if(ret > 0)
  {
      while(1)
      {
        val = 1;  //写时拷贝
        printf("一代进程正在执行 PID:%d PPID:%d 比较值为:%d 地址:%p\n\n", getpid(), getppid(), val, &val);
        sleep(1);
      }
  }
  else
    printf("进程创建失败\n");

  return 0;
}
